#include <iostream>
#include <string>
#include <string_view>
#include <vector>
#include <algorithm>
#include <chrono>

// 使用std::string参数
void process_string(const std::string& str) {
    std::cout << "  处理字符串(std::string): " << str << '\n';
}

// 使用std::string_view参数
void process_string_view(std::string_view sv) {
    std::cout << "  处理字符串(std::string_view): " << sv << '\n';
}

// 比较string和string_view的性能
void compare_performance(const std::string& long_string, int iterations) {
    std::cout << "  性能比较 (" << iterations << " 次迭代):\n";
    
    // 使用string
    auto start = std::chrono::high_resolution_clock::now();
    
    for (int i = 0; i < iterations; ++i) {
        std::string substring = long_string.substr(5, 10);
        std::string substring2 = long_string.substr(15, 10);
        (void)(substring < substring2);  // 避免未使用警告
    }
    
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> string_time = end - start;
    
    // 使用string_view
    start = std::chrono::high_resolution_clock::now();
    
    for (int i = 0; i < iterations; ++i) {
        std::string_view substring(long_string.data() + 5, 10);
        std::string_view substring2(long_string.data() + 15, 10);
        (void)(substring < substring2);  // 避免未使用警告
    }
    
    end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> string_view_time = end - start;
    
    std::cout << "  std::string 用时: " << string_time.count() << " ms\n";
    std::cout << "  std::string_view 用时: " << string_view_time.count() << " ms\n";
    
    if (string_time.count() > 0) {
        double speedup = string_time.count() / string_view_time.count();
        std::cout << "  加速比: " << speedup << "x\n";
    }
}

void demonstrate_string_view() {
    std::cout << "  std::string_view演示:\n\n";
    
    // 1. 基本用法
    std::cout << "  基本用法:\n";
    
    // 从不同来源创建string_view
    std::string hello_str = "你好，世界";
    std::string_view sv1 = "Hello, string_view!";  // 从字符串字面量
    std::string_view sv2 = hello_str;  // 从std::string
    std::string_view sv3(hello_str.data() + 3, 2);  // 从部分字符数组
    
    std::cout << "  sv1: " << sv1 << '\n';
    std::cout << "  sv2: " << sv2 << '\n';
    std::cout << "  sv3: " << sv3 << '\n';
    
    // 2. 不创建副本的子串操作
    std::cout << "\n  子串操作:\n";
    
    std::string_view sv = "这是一个很长的字符串，用于演示string_view的子串操作";
    
    // substr调用不会分配新内存
    std::string_view sv_sub1 = sv.substr(0, 4);  // "这是一个"
    std::string_view sv_sub2 = sv.substr(5, 8);  // "很长的字符串"
    
    std::cout << "  原始string_view: " << sv << '\n';
    std::cout << "  子串1: " << sv_sub1 << '\n';
    std::cout << "  子串2: " << sv_sub2 << '\n';
    
    // 3. remove_prefix和remove_suffix
    std::cout << "\n  使用remove_prefix和remove_suffix:\n";
    
    std::string_view modifiable = "===这是核心内容===";
    std::cout << "  原始: " << modifiable << '\n';
    
    modifiable.remove_prefix(3);  // 移除前3个字符
    std::cout << "  remove_prefix(3): " << modifiable << '\n';
    
    modifiable.remove_suffix(3);  // 移除后3个字符
    std::cout << "  remove_suffix(3): " << modifiable << '\n';
    
    // 4. 查找和比较操作
    std::cout << "\n  查找和比较操作:\n";
    
    std::string_view haystack = "在这个句子中查找特定单词";
    std::string_view needle = "句子";
    
    size_t pos = haystack.find(needle);
    if (pos != std::string_view::npos) {
        std::cout << "  在位置 " << pos << " 找到 \"" << needle << "\"\n";
    }
    
    // 5. 与std::string的互操作性
    std::cout << "\n  与std::string的互操作性:\n";
    
    std::string full_string = "这是完整的字符串";
    std::string_view view = full_string;
    
    process_string(full_string);  // 使用string
    process_string(std::string(view));  // 必须转换为string
    
    process_string_view(full_string);  // 隐式转换为string_view
    process_string_view(view);
    
    // 6. 使用string_view处理常量字符串数组
    std::cout << "\n  处理常量字符串数组:\n";
    
    const char* const names[] = {
        "张三",
        "李四",
        "王五",
        "赵六"
    };
    
    // 使用string_view包装字符串，无需分配内存
    std::vector<std::string_view> name_views;
    for (const auto& name : names) {
        name_views.emplace_back(name);
    }
    
    std::cout << "  排序前: ";
    for (const auto& name : name_views) {
        std::cout << name << " ";
    }
    std::cout << '\n';
    
    // 排序视图而不是字符串
    std::sort(name_views.begin(), name_views.end());
    
    std::cout << "  排序后: ";
    for (const auto& name : name_views) {
        std::cout << name << " ";
    }
    std::cout << '\n';
    
    // 7. 性能比较
    std::string long_string(1000, 'x');  // 创建一个长字符串
    compare_performance(long_string, 100000);
    
    // 8. 注意事项
    std::cout << "\n  注意事项 - 生命周期管理:\n";
    std::cout << "  string_view不拥有数据，使用时必须确保被引用的字符串生命周期比string_view长!\n";
    
    // 错误示例(注释掉以避免未定义行为)
    /*
    std::string_view dangerous;
    {
        std::string temp = "临时字符串";
        dangerous = temp;
    }  // temp被销毁，dangerous现在指向无效内存
    // 使用dangerous可能导致未定义行为
    */
} 